﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
#include<vector>

using namespace std;

class Solution {
public:

    string _solve(string s, string t)
    {
        if (s == "0")
        {
            return "0";
        }
        if (t == "0")
        {
            return "0";
        }

        int i = s.size() - 1;
        int j = t.size() - 1;
        int flag = 0;
        string ret((i + 1) * (j + 1), 0);
        while (i >= 0)
        {
            if (s[i] != '0')
            {
                int flag = 0;
                int k = ret.size() - 1 - (s.size() - 1 - i);
                j = t.size() - 1;
                while (j >= 0 || flag > 0)
                {
                    int a = s[i] - '0';
                    int b = 0;
                    if (j >= 0)
                    {
                        b = t[j] - '0';
                    }
                    int m = 0;
                    if (ret[k - (t.size() - 1 - j)] != 0 && j >= 0)
                    {
                        m = ret[k - (t.size() - 1 - j)] - '0';
                    }
                    ret[k - (t.size() - 1 - j)] = (m + a * b + flag) % 10 + '0';
                    flag = (m + a * b + flag) / 10;
                    j--;
                }
            }
            i--;
        }
        //reverse(ret.begin(), ret.end());
        return ret;
        // write code here
    }

    string solve(string s, string t)
    {
        reverse(s.begin(), s.end());
        reverse(t.begin(), t.end());
        int m = s.size(), n = t.size();
        vector<int> tmp(m + n);
        // 1. ⽆进位相乘相加
        for (int i = 0; i < m; i++)
        {
            for (int j = 0; j < n; j++)
            {
                tmp[i + j] += (s[i] - '0') * (t[j] - '0');
            }
        }
        // 2. 处理进位
        int c = 0;
        string ret;
        for (auto x : tmp)
        {
            c += x;
            ret += c % 10 + '0';
            c /= 10;
        }
        while (c)
        {
            ret += c % 10 + '0';
            c /= 10;
        }
        // 3. 处理前导零
        while (ret.size() > 1 && ret.back() == '0') ret.pop_back();
        reverse(ret.begin(), ret.end());
        return ret;
    }

    bool IsContinuous(vector<int>& numbers)
    {
        //构成顺子---非零数不能重复出现、非零数 最大值-最小值<=4
        int hash[14] = { 0 };
        int nummax = 0, nummin = 14;
        for (auto& e : numbers)
        {
            if (e == 0)
            {
                continue;
            }
            if (hash[e] != 0)
            {
                return false;
            }
            hash[e] = 1;
            if (e > nummax)
            {
                nummax = e;
            }
            if (e < nummin)
            {
                nummin = e;
            }
        }
        return nummax - nummin <= 4;
        // write code here
    }
};
//int main()
//{
//    Solution S;
//    cout<<S.solve("733064366", "459309139");
//    return 0;
//}

//int main()
//{
//    string str;
//    cin >> str;
//    string ret;
//    int i = 0;
//    while (i < str.size())
//    {
//        if (str[i] >= '0' && str[i] <= '9')
//        {
//            string s;
//            int j = i;
//            while (j < str.size() && str[j] >= '0' && str[j] <= '9')
//            {
//                s += str[j];
//                j++;
//            }
//            if (s.size() > ret.size())
//            {
//                ret = s;
//            }
//            i = j;
//        }
//        i++;
//    }
//    cout << ret;
//    return 0;
//}

int fraction(char tem)
{
    if (tem == 'l')
    {
        return 4;
    }
    if (tem == 'o')
    {
        return 3;
    }
    if (tem == 'v')
    {
        return 2;
    }
    if (tem == 'e')
    {
        return 1;
    }
    return 0;
}

//int main()
//{
//    string str = "ansbg";
//    str.insert(2, 1,'l');
//    cout << str;
//    //int m = 0, n = 0;
//    //cin >> m >> n;
//    //vector<vector<char>> v(m, vector<char>(n, 0));
//    //int i = 0, j = 0;
//    //for (i = 0; i < m; i++)
//    //{
//    //    for (j = 0; j < n; j++)
//    //    {
//    //        cin >> v[i][j];
//    //    }
//    //}
//
//    //vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));//dp[i][j]表示走到(i-1,j-1)位置时的最大得分
//    //                                                     //dp[i][j]=max(dp[i-1][j],dp[i][j-1])+ 4/3/2/1/0
//    ////dp[1][1]=fraction(v[0][0]);
//    //for (i = 1; i < m + 1; i++)
//    //{
//    //    for (j = 1; j < n + 1; j++)
//    //    {
//    //        dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + fraction(v[i - 1][j - 1]);
//    //    }
//    //}
//    //cout << dp[m][n] << endl;
//    return 0;
//}
//
//int main()
//{
//    string str;
//    cin >> str;
//    int i = str.size() - 1;
//    int count = 1;
//    while (i >= 0)
//    {
//        if (count == 3 && i != 0)//添加逗号，但是不能再第一个位置添加
//        {
//            str.insert(i, 1, ',');
//            count = 0;
//        }
//        i--;
//        count++;
//    }
//    cout << str;
//    return 0;
//}

int Steps(int n)
{
    if (n == 0)
    {
        return 0;
    }
    if (n == 1)
    {
        return 1;
    }
    if (n == 2)
    {
        return 2;
    }
    return Steps(n - 1) + Steps(n - 2);
}
int main()
{
    int n = 0;
    cin >> n;
    cout << Steps(n);
    return 0;
}